﻿/* Copyright (C) 2013 Interactive Brokers LLC. All rights reserved. This code is subject to the terms
 * and conditions of the IB API Non-Commercial License or the IB API Commercial License, as applicable. */

#include "StdAfx.h"
#include "EMutex.h"

namespace IBOfficial {

	EMutex::EMutex()
	{
#if defined(IB_POSIX)
		pthread_mutex_init(&cs, NULL);
#elif defined(IB_WIN32)
		InitializeCriticalSection(&cs);
#else
#   error "Not implemented on this platform"
#endif
	}

	EMutex::~EMutex(void)
	{
		Leave();
#if defined(IB_POSIX)
		pthread_mutex_destroy(&cs);
#elif defined(IB_WIN32)
		DeleteCriticalSection(&cs);
#else
#   error "Not implemented on this platform"
#endif
	}

	bool EMutex::TryEnter()
	{
#if defined(IB_POSIX)
		return pthread_mutex_trylock(&cs) == 0;
#elif defined(IB_WIN32)
		return TryEnterCriticalSection(&cs);
#else
#   error "Not implemented on this platform"
#endif
	}

	void EMutex::Enter() {
#if defined(IB_POSIX)
		pthread_mutex_lock(&cs);
#elif defined(IB_WIN32)
		EnterCriticalSection(&cs);
#else
#   error "Not implemented on this platform"
#endif
	}

	void EMutex::Leave() {
#if defined(IB_POSIX)
		pthread_mutex_unlock(&cs);
#elif defined(IB_WIN32)
		LeaveCriticalSection(&cs);
#else
#   error "Not implemented on this platform"
#endif
	}
}